package com.jt;


import java.util.Iterator;

public class MyLinkedList<T>  implements Iterable<T>{

    private  Node<T> headNode;

    public  int  size;


    //初始化链表
    public MyLinkedList() {
        headNode=new Node<T>(null,null);
        this.size=0;
    }

    //清空列表的方法
    public void  clear(){
        this.headNode=null;
        this.size=0;
    }
    //判断该链表是否为空
    public  boolean  inEmpty(){
        return  size==0;
    }
    //内部类
    private class  Node<T>{
        T  item;

        Node<T>  nextNode;

        public Node() {
        }

        public Node(T item, Node<T> nextNode) {
            this.item = item;
            this.nextNode = nextNode;
        }
    }
    //添加元素的方法
    public  boolean  add(T t){
         Node<T>  prenode=headNode;
         while(prenode.nextNode!=null){
              prenode=prenode.nextNode;
         }
         Node newNode=new Node(t,null);
         prenode.nextNode=newNode;
         size++;
         return   true;
    }
    //在某处索引添加元素
    public  boolean add(int index,T t){
         Node  preNode=this.headNode;
         for(int i=0;i<index;i++){
             preNode=preNode.nextNode;
         }
        Node<T> tNode = new Node<>(t, null);
        tNode.nextNode=preNode.nextNode;
        preNode.nextNode=tNode;
        size++;
        return  true;
    }


    //删除元素的方法
    public T  remove(T t){
        Node<T>  prenode=headNode;
        while(prenode.nextNode!=null){
            if(prenode.nextNode.item.equals(t)){
                prenode.nextNode=prenode.nextNode.nextNode;
                size--;
                break;
            };
            prenode=prenode.nextNode;
        }
        return  t;
    }
    //根据索引获取某处的元素
    public T  get(int index){
        Node<T>  preNode=headNode;
        for(int i=0;i<=index;i++){
            preNode= preNode.nextNode;
        }
        return preNode.item;
    }
    @Override
    public Iterator iterator() {

        return new Iterator0();

    }
    //内部迭代器
    public  class  Iterator0<T>  implements Iterator<T>{

        private Node currNode;

        public  Iterator0(){
            this.currNode=headNode;
        }

        @Override
        public boolean hasNext() {
            if(currNode.nextNode!=null){
                return  true;
            }
            return false;
        }

        @Override
        public T next() {
            currNode=currNode.nextNode;
            return (T) currNode.item;
        }
    }



}
